/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package genericos;


import basedatos.Pool;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * Clase que facilita un update sobre una tabla de la base de datos. Permite
 * formar la condicion de la sentencia en base a un arreglo de datos.
 *
 * @author Fernando Ramírez Martínez <Servicios Disaster Recovery>
 * @version 2.0 Condicion binaria
 * @see Cambionodo
 * @see ListaNodos
 */
public class Cambio {

    String cond = "";
    String sql = "";
   // Connection conn = null;
    Cambionodo[] valor;
    //static String url = "jdbc:mysql://localhost:3306/";
   // static String dbName = "zianya";
  //  static String driver = "com.mysql.jdbc.Driver";
  //  static String [] userpass=Conexion.userpass();
     Pool p=new Pool();

    /**
     * Metodo principal que realiza la actualizacion de una tabla.
     *
     * @param arr arreglo de Cambionodo para poder tener los elementos para el
     * update
     * @param tabla nombre de la tabla a modificar
     */
    public void actualiza(Cambionodo[] arr, String tabla) {
        valor = arr;
        sql = "UPDATE " + tabla + " SET ";
        preparasql();

    }

    /**
     * Metodo privado que realiza la sentencia sql de update en base a el
     * arreglo de nodos para el cambio obtiene el nombre de los campos a
     * modificar agregandolos a la sentencia
     */
    private void preparasql() {
        
        for (int i = 0; i < valor.length; i++) {

            if (i + 1 == valor.length) {
                if(valor[i].getCat()==5){
                    sql=sql+" "+valor[i].getCampo()+" = "+valor[i].getExp();
                    break;
                }
                sql = sql + valor[i].getCampo() + " = ?";
            } else {
                sql = sql + valor[i].getCampo() + " = ? ,";
            }
        }
        sql = sql + cond;
        //System.out.println("La cadena sql queda " + sql);
        cambiar();
    }

    /**
     * Metodo que realiza la mofificacion basandose en la sentencia sql que se
     * formaanteriormente se apoya del metodo formavalores para incluir el valor
     * de los campos a modificar
     *
     * @see Cambionodo
     */
    private void cambiar() {
        PreparedStatement pst=null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
           pst = conn.prepareStatement(sql);
            System.out.println("Cadena de update final es "+sql);
            pst = formavalores(pst);
            if(pst==null){
                System.out.println("Se injerta aca");
                pst = conn.prepareStatement(sql);
            }
            pst.executeUpdate();
           
            System.out.println("Registro actualizado con exito");
            //sql="";
            //cond="";
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally{

try {
                    pst.close();
                    p.liberarConexion(conn);
                } catch (SQLException ex) {
                    System.out.println(ex);
                
 }
 
    }
    }

    /**
     * Metodo que reune los valores a insertar del arreglo primario que se
     * obtubo en el metodo de actualiza
     *
     * @param pst Statement para pasarse a ejecutar
     * @return el Statement modificado con los valores a actualizar
     */
    private PreparedStatement formavalores(PreparedStatement pst) {
        try {
            for (int i = 0; i < valor.length; i++) {
                if (valor[i].getCat() == 3) {
                    System.out.println("El valor del update es String");
                    pst.setString(i + 1, valor[i].getValors());
                    System.out.println("El valor fue "+valor[i].getValors());
                }
                if (valor[i].getCat() == 1) {
                    System.out.println("El valor del update es Entero");
                    pst.setInt(i + 1, valor[i].getValorint());
                }
                if (valor[i].getCat() == 2) {
                    System.out.println("El valor del update es Fecha");
                    pst.setDate(i + 1, valor[i].getValordo());
                }
                if (valor[i].getCat() == 4) {
                    System.out.println("El valor del update es Double");
                    pst.setDouble(i + 1, valor[i].getX());
                }
                if(valor[i].getCat()==5){
                    System.out.println(sql);
                  //  sql=sql.replace('?', ' ');
                  //  System.out.println(sql+valor[i].getExp());
                }
                   
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return pst;
    }

    /**
     * Metodo sobre cargado para poner la condiocion sobre un campo de tabla y
     * el valor a comparar
     *
     * @param campo nombre del campo de tabla a condicionar
     * @param val valor del campo de tabla a condicionar en un numero entero
     */
    public void setCond(String campo, int val) {
        System.out.println("la condicion por entero esta por agregarse");
        cond = " where " + campo + " = " + val + ";";
        System.out.println("La condicion para el update es "+cond);
    }
   public void setCond(String campo,int val,String campo2,int val2){
       System.out.println("la condicion por entero esta por agregarse");
        cond = " where " + campo + " = " + val + " and "+campo2+" = "+val2+";";
        System.out.println("La condicion para el update es "+cond);
   }
    /**
     * Metodo sobre cargado para poner la condicion sobre un campo de tabla y
     * el valor a comparar
     *
     * @param campo nombre del campo de tabla a condicionar
     * @param val valor del campo de tabla a condicionar en un String
     */
    public void setCond(String campo, String val) {
         System.out.println("la condicion por String esta por agregarse");
        cond = " where " + campo + " = '" + val + "';";
        System.out.println("La condicion para el update es "+cond);
    }
    public void setCond(String con){
        cond = con;
        
    }
}
